home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs47.d81 / cbmhck4b.sfx / cbmhack.4-3 next >
Text File  |  1990-02-12  |  40KB  |  891 lines

  1. =============================================================================
  2. ╠╔╘╘╠┼ ╥┼─ ╥┼┴─┼╥: ═╙-─╧╙ FILE READER FOR THE 128 AND 1571/81 DRIVES.
  3.  
  4. BY ├RAIG ┬RUCE  <CSBRUCE@NEUMANN.UWATERLOO.CA>
  5.  
  6. 1. ╔╬╘╥╧─╒├╘╔╧╬
  7.  
  8. ╘HIS ARTICLE PRESENTS A PROGRAM THAT READS ═╙-─╧╙ FILES AND THE ROOT DIRECTORY
  9. OF ═╙-─╧╙ DISKS.  ╘HE PROGRAM COPIES ONLY FROM DRIVE TO DRIVE WITHOUT
  10. BUFFERING FILE DATA INTERNALLY.  ╘HIS IS SIMPLER AND IMPOSES NO LIMITS ON THE
  11. SIZE OF THE FILES TRANSFERRED, ALTHOUGH IT REQUIRES THE USE OF TWO DISK DRIVES
  12. (OR A LOGICAL DRIVE).  ╘HE USER-INTERFACE CODE IS WRITTEN IN ┬┴╙╔├ AND
  13. PRESENTS A FULL-SCREEN FILE SELECTION MENU.  ╘HE GRUNT-WORK CODE IS WRITTEN IN
  14. ASSEMBLY LANGUAGE AND OPERATES AT MAXIMUM VELOSITY.
  15.  
  16. ╘HE ┬URST ├OMMAND ╔NSTRUCTION ╙ET OF THE 1571/81 IS USED TO READ THE ═╙-─╧╙
  17. DISK BLOCKS AND THE STANDARD KERNEL ROUTINES ARE USED FOR OUTPUTTING THE
  18. DATA.  (╔ AM AN OPERATING SYSTEMS SPECIALIST, SO ╔ CALL IT A KERN┼L!)  ╘HUS,
  19. THE ═╙-─╧╙ FILES MUST BE READ FROM A 1571 OR 1581 DISK DRIVE, BUT THE OUTPUT
  20. DEVICE MAY BE ANY DISK DRIVE TYPE, THE SCREEN OR A PRINTER, OR A VIRTUAL DRIVE
  21. TYPE SUCH AS ╥┴═╠INK, ╥┴═─RIVE, OR ╥┴═─╧╙ (FOR THE ╥┼╒).  ╔T IS INTERESTING TO
  22. NOTE THAT THE DATA CAN BE READ IN FROM AN ═╙-─╧╙ DISK FASTER THAN IT CAN BE
  23. WRITTEN OUT TO A 1571, 1581, OR EVEN A ╥┴═─╧╙ FILE.  ┴ ╥┴═╠INK CAN SWALLOW THE
  24. DATA ONLY SLIGHTLY FASTER THAN IT CAN BE READ.
  25.  
  26. ╠ITTLE ╥ED ╥EADER (╠╥╥) SUPPORTS DOUBLE DENSITY 3.5" DISKS FORMATTED WITH 80
  27. TRACKS, 9 SECTORS PER TRACK, AND 2 SIDES WITH A 1581 AND 5.25" DOUBLE DENSITY
  28. DISKS FORMATTED WITH 40 TRACKS, 9 SECTORS PER TRACK, AND 2 SIDES WITH A 1571.
  29. ┴ LIMIT OF 128 DIRECTORY ENTRIES AND 3 ╞ILE ┴LLOCATION ╘ABLE (╞┴╘) SECTORS IS
  30. IMPOSED.  ╘HERE MUST BE 2 COPIES OF THE ╞┴╘ AND THE CLUSTER SIZE MAY BE 1 OR 2
  31. SECTORS.  ╘HE SECTOR SIZE MUST BE 512 BYTES.
  32.  
  33. ╧H, ABOUT THE NAME.  ╔T IS A PLAY ON THE NAME OF ANOTHER ═╙-─╧╙ FILE COPIER
  34. AVAILABLE FOR THE ├-128.  "╠ITTLE" MEANS THAT IT IS SMALLER IN SCOPE THAN THE
  35. OTHER PROGRAM, AND "╥ED" IS A DIFFERENT PRIMARY COLOR TO AVOID ANY LEGAL
  36. COMPLICATIONS.  ╔T IS ALSO THE NON-WHITE COLOR OF THE FLAG OF THE COUNTRY OF
  37. ORIGIN OF THIS PROGRAM (NO, ╔ AM NOT ╩APANESE).  ┴LSO, THIS PROGRAM IS ╨UBLIC
  38. ─OMAIN ╙OFTWARE, AS IS ALL SOFTWARE ╔ DEVELOP FOR 8-BIT ├OMMODORE ├OMPUTERS.
  39. ╞EEL FREE TO ┼-MAIL ME IF YOU HAVE QUESTIONS OR COMMENTS ABOUT THIS ARTICLE.
  40.  
  41. 2. ╒╙┼╥ ╟╒╔─┼
  42.  
  43. ╠╧┴─ AND ╥╒╬ THE "LRR.128" ┬┴╙╔├ PROGRAM FILE.  ╫HEN THE PROGRAM IS FIRST RUN,
  44. IT WILL DISPLAY AN "INITIALIZING" MESSAGE AND WILL LOAD IN THE BINARY MACHINE
  45. LANGUAGE PACKAGE FROM THE "CURRENT" ├OMMODORE ─╧╙ DRIVE (THE CURRENT DRIVE IS
  46. OBTAINED FROM ╨┼┼╦(186) - THE LAST DEVICE ACCESSED).  ╘HE BINARY PACKAGE IS
  47. LOADED ONLY ON THE FIRST RUN AND IS NOT RELOADED ON SUBSEQUENT RUNS IF THE
  48. PACKAGE ╔─ FIELD IS IN PLACE.
  49.  
  50. 2.1. ═┴╔╬ ╙├╥┼┼╬
  51.  
  52. ╘HE MAIN SCREEN OF THE PROGRAM IS THEN DISPLAYED.  ╘HE MAIN SCREEN OF THE
  53. PROGRAM WILL LOOK SOMETHING LIKE THIS:
  54.  
  55.    ═╙-─┼╓=9    ═╙-╘┘╨┼=1581    ├┬═-─┼╓=8
  56.  
  57.    ╬╒═  ╙  ╘╥╬  ╘┘╨  ╞╔╠┼╬┴═┼  ┼╪╘  ╠┼╬╟╘╚
  58.    ---  -  ---  ---  --------  ---  ------
  59.      1  *  ┴╙├  ╙┼╤  ╚┴├╦4     ╘╪╘  120732
  60.      2     ┬╔╬  ╨╥╟  ╥┴═─╧╙    ╙╞╪   34923
  61.  
  62.    ─=─╔╥┼├╘╧╥┘  ═=═╙-─┼╓  ╞=├┬═-─┼╓ ╤=╤╒╔╘
  63.    ╘=╘╧╟╟╠┼-├╧╠╒═╬, ├=├╧╨┘-╞╔╠┼╙, +/- ╨┴╟┼
  64.  
  65. EXCEPT THAT IMMEDIATELY AFTER STARTING UP, "<NO FILES>" WILL BE DISPLAYED
  66. RATHER THAN FILENAMES.  ╘HE "═╙-─┼╓" AND "═╙-╘┘╨┼" FIELDS GIVE THE DEVICE
  67. NUMBER AND TYPE OF THE DRIVE CONTAINING THE ═╙-─╧╙ DISK TO COPY FROM, AND THE
  68. "├┬═-─┼╓" GIVES THE DEVICE NUMBER OF THE DRIVE/VIRTUAL DRIVE/CHARACTER DEVICE
  69. TO COPY FILE DATA TO.
  70.  
  71. ╔NFORMATION ABOUT ALL ═╙-─╧╙ FILES IN THE ROOT DIRECTORY OF THE ═╙-─╧╙ DISK IS
  72. DISPLAYED IN COLUMNS BELOW THE DRIVE INFORMATION.  "╬╒═" GIVES THE NUMBER OF
  73. THE ═╙-─╧╙ FILE IN THE DIRECTORY LISTING, AND "╙" INDICATES WHETHER THE FILE
  74. IS "SELECTED" OR NOT.  ╔F THE FILE IS SELECTED, AN ASTERISK (*) IS DISPLAYED;
  75. OTHERWISE, A BLANK IS DISPLAYED.  ╫HEN YOU LATER ENTER ├OPY ═ODE, ONLY THE
  76. FILES THAT HAVE BEEN "SELECTED" ARE COPIED.
  77.  
  78. ╘HE "╘╥╬" FIELD INDICATES THE CHARACTER TRANSLATION SCHEME TO BE USED WHEN THE
  79. FILE IS COPIED.  ┴ VALUE OF "┬╔╬" (BINARY) MEANS NO TRANSLATION AND A VALUE OF
  80. "┴╙├" (ASCII) MEANS THE FILE CHARACTERS ARE TO BE TRANSLATED FROM ═╙-─╧╙ ┴╙├╔╔
  81. (OR "┴╙├╔╔-├R╠F") TO ╨┼╘╙├╔╔.  ╘HE "╘┘╨" FIELD INDICATES THE TYPE OF
  82. ├OMMODORE-─╧╙ FILE TO CREATE FOR WRITING THE ═╙-─╧╙ FILE CONTENTS INTO.  ╘HE
  83. POSSIBLE VALUES ARE "╙┼╤" (SEQUENTIAL) AND "╨╥╟" (PROGRAM).  ╘HE VALUES OF THE
  84. ╘╥╬ AND ╘┘╨ FILEDS ARE SET INDEPENDENTLY, SO YOU CAN COPY BINARY DATA TO ╙┼╤
  85. FILES AND ASCII DATA TO ╨╥╟ FILES IF YOU WISH.
  86.  
  87. ╘HE "╞╔╠┼╬┴═┼" AND "┼╪╘" FIELDS GIVE THE FILENAME AND EXTENSION TYPE OF THE
  88. ═╙-─╧╙ FILES AND "╠┼╬╟╘╚" GIVES THE EXACT LENGTH OF THE FILES IN BYTES.  ╬OTE
  89. THAT IF YOU PERFORM "┴╙├" TRANSLATION ON A FILE, ITS ╨┼╘╙├╔╔ VERSION WILL HAVE
  90. A SHORTER LENGTH.
  91.  
  92. 2.2. ╒╙┼╥ ├╧══┴╬─╙
  93.  
  94. ╘HE BOTTOM OF THE SCREEN GIVES THE COMMAND SUMMARY.  ┴FTER STARTING THE
  95. PROGRAM, YOU WILL WANT TO SETUP THE ═╙-─╧╙ AND ├┬═-─╧╙ DRIVES WITH THE "═" AND
  96. "╞" COMMANDS.  ╙IMPLY PRESS THE (LETTER) KEY CORRESPONDING TO THE COMMAND
  97. NAME TO ACTIVATE THE COMMAND.  ╨RESSING ═ WILL PROMPT YOU FOR THE ═╙-─╧╙ ─RIVE
  98. ╬UMBER AND THE ═╙-─╧╙ ─RIVE ╘YPE.  ╔N BOTH CASES, TYPE THE NUMBER AND PRESS
  99. ╥┼╘╒╥╬.  (╙ORRY FOR INSULTING ALL NON-NOVICES OUT THERE, BUT ╔ WANT TO BE
  100. COMPLETE).  ╘HE ═╙-─╧╙ DRIVE NUMBER CANNOT BE THE SAME AS THE ├┬═-─╧╙ DRIVE
  101. NUMBER (SINCE THE PROGRAM COPIES FROM DRIVE-TO-DRIVE WITHOUT INTERNAL
  102. BUFFERING).  ╞OR THE DRIVE TYPE, ENTER AN "8", "81", OR "1581" FOR A 1581
  103. DRIVE OR ANYTHING ELSE FOR A 1571 DRIVE.
  104.  
  105. ╨RESSING ╞ WILL PROMPT YOU FOR THE ├┬═-─╧╙ DEVICE NUMBER.  ┘OU MAY ENTER A
  106. NUMBER FROM 0 TO 30, EXCEPT THAT IT MUST NOT BE THE ═╙-─╧╙ DRIVE NUMBER.
  107. ┼NTER A "1" FOR ├ASSETTE ─RIVE (╟OD FORBID!), A "3" FOR THE SCREEN, A "4" FOR
  108. THE PRINTER (WITH AN AUTOMATIC SECONDARY ADDRESS OF 7 (LOWERCASE)), ANY NUMBER
  109. ABOVE 7 FOR A ├OMMODORE DISK DRIVE OR SPECIAL VIRTUAL DRIVE, OR A VALUE OF "0"
  110. FOR THE SPECIAL "NULL" DRIVE.  ┴ ├┬═-─┼╓ VALUE OF 0 WILL CASE THE PROGRAM TO
  111. READ ═╙-─╧╙ FILES AND DO NOTHING WITH THE OUTPUT.  ┘OU CAN USE THIS FEATURE TO
  112. CHECK OUT THE RAW READING SPEED OF THE PROGRAM.
  113.  
  114. ┴FTER SETTING UP THE DRIVES, PRESS ─ TO READ IN THE ROOT DIRECTORY OFF THE
  115. ═╙-─╧╙ DISK.  ╘HE DATA WILL COME BLAZING IN FROM THE DISK BUT ┬┴╙╔├ WILL TAKE
  116. ITS GOOD OLE TIME SIFTING THROUGH IT.  ╞ILENAMES ARE DISPLAYED ON THE SCREEN
  117. AS THEY ARE SCANNED IN.  ╘HE PROGRAM WILL (EVENTUALLY) RETURN TO THE MAIN
  118. SCREEN AND DISPLAY THE FORMATTED FILE INFORMATION.  ╧NE NOTE: THE PROCESS OF
  119. LOGGING IN A 1581 ═╙-─╧╙ DISK TAKES ABOUT 12 SECONDS (ON MY 1581, ANYWAY), SO
  120. BE PATIENT.  ┴N ═╙-─╧╙ DISK WILL HAVE TO BE "LOGGED IN" EVERY TIME YOU CHANGE
  121. ═╙-─╧╙ DISKS.  (─ISKS ARE LOGGED IN AUTOMATICALLY).
  122.  
  123. ┴ COUPLE OF NOTES ABOUT ACCESSING ═╙-─╧╙ DISKS: DON'T TRY TO ACCESS A DEVICE
  124. THAT IS NOT PRESENT BECAUSE THE MACHINE LANGUAGE ROUTINES CANNOT HANDLE THIS
  125. ERROR FOR SOME REASON AND WILL LOCK UP, REQUIRING A ╙╘╧╨+╥┼╙╘╧╥┼.  ┴LSO, MAKE
  126. SURE THAT AN ACTUAL ═╙-─╧╙ DISK IS LOADED INTO THE DRIVE.  ╔F YOU ACCIDENTALLY
  127. PLACE ├OMMODORE-─╧╙ DISK INTO THE ═╙-─╧╙ DRIVE, THE 1581 WILL REPORT AN
  128. INVALID BOOT PARAMETERS ERROR (#60), BUT A 1571 WILL LOCK UP (SINCE ╔ DON'T
  129. CHECK THE SECTOR SIZE AND MY BURST ROUTINES ARE EXPECTING 512 BYTES TO COME
  130. OUT OF A SECTOR WHEREAS ├OMMODORE DISKS HAVE ONLY 256 BYTES PER SECTOR).
  131.  
  132. ╬OW YOU ARE READY TO PICK WHAT FILES YOU WANT COPIED AND HOW YOU WANT THEM
  133. COPIED.  ┘OU WILL NOTICE THAT A "CURSOR" APPEARS IN THE "╙" COLUMN OF THE
  134. FIRST FILE.  ┘OU MAY MOVE THE CURSOR AROUND WITH THE CURSOR KEYS: ╒╨, ─╧╫╬,
  135. ╠┼╞╘, ╥╔╟╚╘, ╚╧═┼, AND ├╠╥.  ├╠╥ (╙╚╔╞╘-╚╧═┼) WILL MOVE THE CURSOR BACK TO THE
  136. FIRST FILE ON THE FIRST SCREEN.  ┘OU CAN MOVE THE CURSOR AMONG THE SELECT,
  137. TRANSLATION, AND FILE-TYPE COLUMNS OF ALL THE FILES.  ╨RESSING A ╙╨┴├┼ OR A
  138. ╥┼╘╒╥╬ WILL TOGGLE THE VALUE OF THE FIELD THAT THE CURSOR IS ON.  ╘O TOGGLE
  139. ALL OF THE VALUES OF THE "CURSOR" COLUMN (INCLUDING FILES ON ALL OTHER
  140. SCREENS), PRESS ╘.  ┘OU WILL NOTICE THAT MOVING THE CURSOR AROUND AND TOGGLING
  141. FIELDS IS A BIT SLUGGISH, ESPECIALLY IF YOU ARE IN ╙LOW MODE ON THE 40-COLUMN
  142. SCREEN.  ─ID ╔ MENTION THAT THIS PROGRAM WILL RUN ON EITHER THE 40 OR
  143. 80-COLUMN SCREEN?  ╘OGGLING AN ENTIRE COLUMN CAN TAKE A COUPLE OF SECONDS.
  144.  
  145. ╔F THERE ARE MORE THAN 18 ═╙-─╧╙ FILES, YOU CAN PRESS THE "+" AND "-" KEYS TO
  146. MOVE AMONG ALL OF THE SCREENS OF FILES.  ╘HE CURSOR MOVEMENT KEYS WILL WRAP
  147. AROUND ON THE CURRENT SCREEN.  "+" IS PAGE FORWARD, AND "-" IS PAGE BACKWARD.
  148. ╘HE SCREENS WRAP AROUND TOO.
  149.  
  150. ┴FTER YOU HAVE SELECTED ALL OF THE FILES YOU WANT TO COPY AND THEIR TRANSLATION
  151. AND FILE-TYPE FIELDS HAVE BEEN SET, PRESS THE ├ KEY TO GO INTO ├OPY ═ODE (NEXT
  152. SECTION).  ┴FTER COPYING, YOU ARE RETURNED TO THE MAIN SCREEN WITH ALL OF THE
  153. FIELD SETTINGS STILL INTACT.  ╘O EXIT FROM THE PROGRAM, PRESS ╤.
  154.  
  155. 2.3. ├╧╨┘ ═╧─┼
  156.  
  157. ╫HEN YOU ENTER COPY MODE, THE SCREEN WILL CLEAR AND THE NAME OF EACH SELECTED
  158. FILE IS DISPLAYED AS IT IS BEING COPIED.  ╔F AN ERROR IS ENCOUNTERED ON EITHER
  159. THE ═╙-─╧╙ OR ├┬═-─╧╙ DRIVE DURING COPYING, AN ERROR MESSAGE WILL BE DISPLAYED
  160. AND COPYING WILL CONTINUE (AFTER YOU PRESS A KEY FOR ═╙-─╧╙ ERRORS).
  161.  
  162. ╘O GENERATE A ├┬═-─╧╙ FILENAME FROM AN ═╙-─╧╙ FILENAME, THE EIGHT FILENAME
  163. CHARACTERS ARE TAKEN (INCLUDING SPACES) AND A DOT (.) AND THE THREE CHARACTERS
  164. OF THE EXTENSION ARE APPENDED.  ╘HEN, ALL SPACES ARE REMOVED, AND IF THE NAME
  165. ENDS WITH A DOT (.) CHARACTER, THEN THAT DOT CHARACTER IS REMOVED AS WELL.  ╔
  166. THINK THIS IS FAIRLY REASONABLE.
  167.  
  168. ╔F THERE ALREADY IS A FILE WITH THE SAME FILENAME ON THE ├┬═-─╧╙ DISK, THEN
  169. YOU WILL BE PROMPTED IF YOU WANT TO OVERWRITE THE FILE OR NOT.  ┼NTERING AN
  170. "N" WILL ABORT THE COPYING OF THAT FILE AND GO ON TO THE NEXT FILE, AND
  171. ENTERING A "Y" (OR ANYTHING ELSE) WILL CAUSE THE ├┬═-─╧╙ FILE TO BE
  172. "SCRATCHED" AND THEN RE-WRITTEN.
  173.  
  174. ╘HE PHYSICAL COPYING OF THE FILE IS DONE COMPLETELY IN MACHINE LANGUAGE AND
  175. NOTHING IS DISPLAYED ON THE SCREEN WHILE THIS IS HAPPENING, BUT YOU CAN FOLLOW
  176. THINGS BY LOOKING AT DAS BLINKIN LICHTES AND LISTENING FOR CLICKS AND GRINDS.
  177. ┘OU WILL PROBABLY BE SURPRISED BY THE ═╙-─╧╙ FILE READING SPEED (╔ MEAN IN A
  178. GOOD WAY).  ╘HE DISK DATA IS READ IN WHOLE TRACKS AND CACHED IN MEMORY AND THE
  179. DIRECTORY INFORMATION AND THE ╞┴╘ ARE RETAINED IN MEMORY AS WELL.  ╘HE RESULT
  180. IS THAT MINIMAL TIME IS SPENT READING DISK DATA, AND NO COSTLY SEEKS ARE
  181. REQUIRED FOR OPENING A NEW ═╙-─╧╙ FILE.  ┴ RESULT IS THAT SMALL FILES ARE
  182. COPIED ONE AFTER ANOTHER VERY QUICKLY.  ┘OU WILL HAVE TO WAIT, HOWEVER, ON THE
  183. RELATIVELY SLOW STANDARD KERNEL/├OMMODORE-─╧╙ FILE WRITING.
  184.  
  185. ┴ FEW CHANGES HAD TO BE MADE TO THE PROGRAM TO ACCOMODATE THE ╥┴═─╧╙ PROGRAM.
  186. ╥┴═─╧╙ USES MEMORY FROM $2300 TO $3╞╞╞ OF ╥┴═0, WHICH IS NOT REALLY A GOOD
  187. PLACE FOR A DEVICE DRIVER, AND IT USES SOME OF THE ZERO-PAGE LOCATIONS THAT ╔
  188. WANTED TO USE.  ┬UT, DIFFICULTIES WERE OVERCOME.  ╘HE IMPORTANCE OF ╥┴═─╧╙
  189. COMPATIBILITY IS THAT IF YOU ONLY HAVE ONE DISK DRIVE BUT YOU HAVE AN ╥┼╒, YOU
  190. CAN USE ╥┴═─╧╙ TO STORE THE ═╙-─╧╙ FILES TEMPORARILY.  ╔F YOU ONLY HAVE ONE
  191. DISK DRIVE AND NO ╥┼╒, YOU ARE ╙╧╠ (╧UT OF ╠UCK) UNLESS YOU CAN GET A
  192. ╥AM─ISK-TYPE PROGRAM FOR AN UNEXPANDED 128.  ╘HE ╥┴═─╧╙ PROGRAM IS AVAILABLE
  193. FROM ╞╘╨ SITE "CCOSUN.CALTECH.EDU" IN FILE "/PUB/RKNOP/UTIL128/RAMDOSII.SFX".
  194. ╧NE NOTE ╔ FOUND OUT ABOUT ╥┴═─╧╙: YOU CANNOT USE A
  195.  
  196. ─╧╨┼╬#1,(├╞$),╒(├─),╫
  197.  
  198. WITH IT LIKE YOU ARE SUPPOSED TO BE ABLE TO; YOU HAVE TO USE A
  199.  
  200. ─╧╨┼╬#1,(├╞$+",╫"),╒(├─)
  201.  
  202. ╚ERE IS A TABLE OF COPYING SPEEDS FOR COPYING FROM 1571S AND 1581S WITH ┴╙├
  203. AND ┬╔╬ TRANSLATION MODES.  ┴LL FIGURES ARE IN BYTES/SECOND.  ╘HESE RESULTS
  204. WERE OBTAINED FROM COPYING A 127,280 BYTE TEXT FILE (THE TEXT OF ├= ╚ACKING
  205. ╔SSUE #3).
  206.  
  207.    ╞╥╧═  \ ╘╧: "NULL"     ╥┴═╠INK     ╥┴═─╧╙     ╩─1581     ╩─1571
  208.    -------+    ------     -------     ------     ------     ------
  209.    81-BIN ⁿ      5772        3441       2146        N/A        644
  210.    81-ASC ⁿ      5772        3434       2164        N/A        661
  211.    71-BIN ⁿ      4323        2991       1949       1821        N/A
  212.    71-ASC ⁿ      4323        2982       1962       1847        N/A
  213.  
  214. ╘HE "NULL" DEVICE IS THAT "0" ├┬═-─╧╙ DEVICE NUMBER, AND A COUPLE OF ENTRIES
  215. ARE "N/A" SINCE ╔ ONLY HAVE ONE 1571 AND ONE 1581.  ╬OTE THAT MY 71 AND 81 ARE
  216. ╩IFFY─╧╙-IFIED, SO THE PERFORMANCE OF A STOCK 71/81 WILL BE POORER.  ╩IFFY─╧╙
  217. GIVES ABOUT A 2X PERFORMANCE IMPROVEMENT FOR THE STANDARD FILE ACCESSING CALLS
  218. (OPEN, CLOSE, CHRIN, CHROUT).  ╥┴═─╧╙ DOESN'T SEEM TO BE AS SNAPPY AS YOU
  219. MIGHT THINK.
  220.  
  221. ╘HE "NULL" FIGURES ARE QUITE IMPRESSIVE, BUT THE RAW SECTOR READING SPEED
  222. WITHOUT THE OVERHEAD OF MUCKING AROUND WITH FILE ORGANIZATION IS 6700
  223. BYTES/SEC FOR A 1581 AND 4600 ┬/S FOR A 71.  ╘HE REASON THAT THE 1571 OPERATES
  224. SO QUICKLY IS THAT ╔ USE A SECTOR INTERLEAVE OF 4 (WHICH IS OPTIMAL) FOR
  225. READING THE TRACKS.  ╔ THINK THAT OTHER ═╙-─╧╙ FILE COPIER PROGRAM USES AN
  226. INTERLEAVE OF 1 (WHICH IS NOT OPTIMAL).  ╔ LOSE SOME OF THE RAW PERFORMANCE
  227. BECAUSE ╔ COPY THE FILE DATA INTERNALLY ONCE BEFORE OUTPUTTING IT (TO SIMPLIFY
  228. SOME OF THE CODE).
  229.  
  230. ╔N A COUPLE OF PLACES YOU WILL NOTICE THAT ┴╙├ TRANSLATION GIVES SLIGHTLY
  231. BETTER OR SLIGHTLY WORSE PERFORMANCE THAN ┬╔╬.  ╘HIS IS BECAUSE ALTHOUGH
  232. SLIGHTLY MORE WORK IS REQUIRED TO TRANSLATE THE CHARACTERS, SLIGHTLY FEWER
  233. CHARACTERS WILL HAVE TO BE WRITTEN TO THE ├┬═-─╧╙ FILE, SINCE ╨┼╘╙├╔╔ USES
  234. ONLY ├╥ WHERE ═╙-─╧╙ ┴╙├╔╔ USES ├╥ AND ╠╞ TO REPRESENT END-OF-LINE.
  235. ╘RANSLATION IS DONE BY USING A TABLE (THAT YOU CAN CHANGE IF YOU WISH).  ═ANY
  236. ENTRIES IN THIS TABLE CONTAIN A VALUE OF ZERO, WHICH MEANS THAT NO CHARACTER
  237. WILL BE OUTPUT ON TRANSLATION.  ═OST OF THE CONTROL CHARACTERS AND ALL OF THE
  238. CHARACTERS OF VALUE 128 (0X80) OR GREATER ARE THROWN AWAY ON BEING
  239. TRANSLATED.  ╘HE TABLE IS SET UP SO THAT ├╥ CHARACTERS ARE THROWN AWAY AND THE
  240. ╠╞ CHARACTER IS TRANSLATED TO A ├┬═-─╧╙ ├╥ CHARACTER.  ╘HUS, BOTH ═╙-─╧╙ ┴╙├╔╔
  241. FILES AND ╒╬╔╪ ┴╙├╔╔ FILES CAN BE TRANSLATED CORRECTLY.
  242.  
  243. 2. ┬╒╥╙╘ ├╧══┴╬─╙
  244.  
  245. ╘HREE BURST COMMANDS FROM THE 1571/81 DISK DRIVE ┬URST ├OMMAND ╔NSTRUCTION ╙ET
  246. ARE REQUIRED TO ALLOW THIS PROGRAM TO READ THE ═╙-─╧╙ DISKS: ╤UERY ─ISK
  247. ╞ORMAT, ╙ECTOR ╔NTERLEAVE, AND ╥EAD.  ╘HE GRUNGY DETAILS ABOUT ISSUING BURST
  248. COMMANDS AND BURST MODE HANDSHAKING ARE COVERED IN ├= ╚ACKING ╔SSUE #3.  ╘HE
  249. ╤UERY ─ISK ╞ORMAT COMMAND IS USED TO "LOG IN" THE ═╙-─╧╙ DISK.  ╘HE ╔NQUIRE
  250. ─ISK BURST COMMAND CANNOT BE USED WITH AN ═╙-─╧╙ DISK ON THE 1581 FOR SOME
  251. UNKNOWN REASON.  ╔ FOUND THIS OUT THE HARD WAY.  ╘HE ╤UERY ─ISK ╞ORMAT COMMAND
  252. HAS THE FOLLOWING FORMAT:
  253.  
  254.     ┬┘╘┼ \ BIT: 7     6     5     4     3     2     1     0  ⁿ ╓ALUE
  255.    -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
  256.      0    ⁿ     0  ⁿ  1  ⁿ  0  ⁿ  1  ⁿ  0  ⁿ  1  ⁿ  0  ⁿ  1  ⁿ  "╒"
  257.      1    ⁿ     0  ⁿ  0  ⁿ  1  ⁿ  1  ⁿ  0  ⁿ  0  ⁿ  0  ⁿ  0  ⁿ  "0"
  258.      2    ⁿ     ╞  ⁿ  ╪  ⁿ  ╪  ⁿ  ╙  ⁿ  1  ⁿ  0  ⁿ  1  ⁿ  ╬  ⁿ  10
  259.    -------+--------------------------------------------------+-------
  260.  
  261. WHERE THE ╞, ╙, AND ╬ BITS HAVE A VALUE OF 0 FOR OUR PURPOSES.  ┴ RESPONSE OF
  262. A BURST STATUS BYTE AND SIX OTHER THROW-AWAY BYTES IS GIVEN FROM THE DRIVE.
  263. ╘HIS COMMAND TAKES QUITE A LONG TIME TO EXECUTE ON MY 1581 BUT WORKS QUITE
  264. QUICKLY ON MY 1571.  ┘OU ONLY HAVE TO LOG IN A DISK WHENEVER YOU CHANGE
  265. DISKS.
  266.  
  267. ╘HE ╙ECTOR ╔NTERLEAVE COMMAND IS USED TO SET A SOFT INTERLEAVE FOR THE ╥EAD
  268. COMMAND.  ╔ USE AN INTERLEAVE OF 1 FOR THE 1581 AND AN INTERLEAVE OF 4 FOR THE
  269. 1571.  ╘HIS MEANS THAT THE ═╙-─╧╙ SECTORS WILL COME FROM 1571 TO THE COMPUTER
  270. IN THE FOLLOWING ORDER: 1, 5, 9, 4, 8, 3, 7, 2, 6 (THERE ARE 9 SECTORS PER
  271. TRACK ON AN ═╙-─╧╙ DISK (BOTH 3.5" AND 5.25"), NUMBERED FROM 1 TO 9).  ╠╥╥
  272. HANDLES THE DATA COMING IN IN THIS ORDER, AND IN STRAIGHT ORDER FROM THE
  273. 1581.  ╘HE ╙ECTOR ╔NTERLEAVE COMMAND HAS THE FOLLOWING FORMAT, WHERE THE ╫ AND
  274. ╬ BITS ARE 0 FOR US:
  275.  
  276.     ┬┘╘┼ \ BIT: 7     6     5     4     3     2     1     0  ⁿ ╓ALUE
  277.    -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
  278.      0    ⁿ     0  ⁿ  1  ⁿ  0  ⁿ  1  ⁿ  0  ⁿ  1  ⁿ  0  ⁿ  1  ⁿ  "╒"
  279.      1    ⁿ     0  ⁿ  0  ⁿ  1  ⁿ  1  ⁿ  0  ⁿ  0  ⁿ  0  ⁿ  0  ⁿ  "0"
  280.      2    ⁿ     ╫  ⁿ  ╪  ⁿ  ╪  ⁿ  0  ⁿ  1  ⁿ  0  ⁿ  0  ⁿ  ╬  ⁿ   8
  281.      3    ⁿ                   <INTERLEAVE>                   ⁿ 1 OR 4
  282.    -------+--------------------------------------------------+-------
  283.  
  284. ╘HE ╥EAD COMMAND IS USED TO TRANSFER THE NINE SECTORS OF A TRACK TO THE
  285. COMPUTER IN THE ORDER SPECIFIED BY THE INTERLEAVE.  ╘HE FORMAT IS:
  286.  
  287.     ┬┘╘┼ \ BIT: 7     6     5     4     3     2     1     0  ⁿ ╓ALUE
  288.    -------+--------+-----+-----+-----+-----+-----+-----+-----+-------
  289.      0    ⁿ     0  ⁿ  1  ⁿ  0  ⁿ  1  ⁿ  0  ⁿ  1  ⁿ  0  ⁿ  1  ⁿ  "╒"
  290.      1    ⁿ     0  ⁿ  0  ⁿ  1  ⁿ  1  ⁿ  0  ⁿ  0  ⁿ  0  ⁿ  0  ⁿ  "0"
  291.      2    ⁿ    ╘/╠ ⁿ  ┼  ⁿ ┬/╪ ⁿ  ╙  ⁿ  0  ⁿ  0  ⁿ  0  ⁿ  ╬  ⁿ 0 OR 16
  292.      3    ⁿ                      <TRACK>                     ⁿ  ???
  293.      4    ⁿ                      <SECTOR>                    ⁿ   1
  294.      5    ⁿ                <NUMBER OF SECTORS>               ⁿ   9
  295.    -------+--------------------------------------------------+-------
  296.  
  297. ╘HERE ARE A COUPLE OF DIFFERENCES BETWEEN THE 1571 AND 1581 VERSIONS OF THIS
  298. COMMAND.  ═OST IMPORTANT, THE ╙ BIT (╙IDE OF DISK TO USE) HAS THE OPPOSITE
  299. MEANING ON THE TWO DRIVES.  ╘HERE'S NO GOOD REASON THAT ╔ KNOW OF FOR THIS
  300. INCONSISTENCY.  ╘HIS IS THE REASON THAT ╠╥╥ NEEDS TO KNOW WHAT TYPE OF ═╙-─╧╙
  301. DRIVE IT IS DEALING WITH (PLUS INTERLEAVING).
  302.  
  303. ╘HE READ COMMAND RETURNS THE FOLLOWING DATA USING BURST MODE HANDSHAKING:
  304.  
  305.  
  306.        +-------------------+
  307.      0 ⁿ ┬URST ╙TATUS ┬YTE ⁿ
  308.        +-------------------+
  309.      1 ⁿ                   ⁿ
  310.    ... +  512 ─ATA ┬YTES   ⁿ
  311.    512 ⁿ                   ⁿ
  312.        +-------------------+
  313.  
  314. FOR EACH SECTOR TRANSFERRED.  ╔F THE ┬URST ╙TATUS ┬YTE INDICATES AN ERROR,
  315. THEN THE DATA IS NOT TRANSFERRED AND NONE OF THE FOLLOWING SECTORS ARE
  316. EITHER.  ╔F THE STATUS BYTE GIVES A "─ISK ├HANGED" ERROR, THEN YOU HAVE TO LOG
  317. IN THE DISK WITH THE ╤UERY ─ISK ╞ORMAT COMMAND BEFORE READ WILL WORK
  318. PROPERLY.  ╘HIS IS ACTUALLY A GOOD FEATURE SINCE IT LETS YOU KNOW ABOUT A DISK
  319. CHANGE SO YOU CAN UPDATE ANY DATA STRUCTURES YOU MAY HAVE.  ╠╥╥ SIMPLY RE-LOGS
  320. IN THE DISK WITHOUT UPDATING ANY DATA STRUCTURES AND RE-TRIES THE FAILED READ
  321. OPERATION.
  322.  
  323. 3. ═╙-─╧╙ ─╔╙╦ ╞╧╥═┴╘
  324.  
  325. ┴N ═╙-─╧╙ DISK IS SEPARATED INTO 4 DIFFERENT PARTS: THE ┬OOT ╙ECTOR, THE
  326. ╞┴╘(S), THE ╥OOT ─IRECTORY, AND THE ╞ILE ─ATA ╙ECTORS.  ╘HE LOGICAL SECTORS
  327. (BLOCKS) OF A DISK ARE NUMBERED FROM 0 TO SOME MAXIMUM NUMBER (1439 FOR A
  328. 3.5", 719 FOR A 5.25" ── DISK).  ╘HE PHYSICAL LAYOUT AND THE LOGICAL SECTOR
  329. NUMBERS TYPICALLY USED BY A 3.5" DISK ARE SHOWN HERE:
  330.  
  331.          +-------------------+
  332.        0 ⁿ    ┬OOT ╙ECTOR    ⁿ
  333.          +-------------------+
  334.     1..3 ⁿ    ╞┴╘ COPY #1    ⁿ
  335.          +-------------------+
  336.     4..6 ⁿ    ╞┴╘ COPY #2    ⁿ
  337.          +-------------------+
  338.    7..14 ⁿ  ╥OOT ─IRECTORY   ⁿ
  339.          +-------------------+
  340.       15 ⁿ                   ⁿ
  341.      ... ⁿ ╞ILE ─ATA ╙ECTORS ⁿ
  342.     1439 ⁿ                   ⁿ
  343.          +-------------------+
  344.  
  345. 3.1. ╘╚┼ ┬╧╧╘ ╙┼├╘╧╥
  346.  
  347. ╘HE ┬OOT ╙ECTOR IS ALWAYS AT LOGICAL SECTOR NUMBER 0.  ╔T CONTAINS SOME
  348. IMPORTANT INFORMATION ABOUT THE FORMAT OF THE DISK AND IT ALSO CONTAINS CODE
  349. TO BOOT AN ═╙-─╧╙ MACHINE FROM.  ╫E AREN'T CONCERNED WITH THE BOOTSTRAPPING
  350. CODE, BUT THE IMPORTANT VALUES WE NEED TO OBTAIN FROM THE BOOT SECTOR ARE:
  351.  
  352.    ┴┬┬╥     ╧╞╞╙┼╘     1571     1581     ─┼╙├╥╔╨╘╔╧╬
  353.    ----     ------     ----     ----     -----------
  354.     ├╙        13          2        2     ├LUSTER SIZE IN SECTORS
  355.     ╬┬        14          1        1     ╬UMBER OF BOOT SECTORS
  356.     ╬╞        16          2        2     ╬UMBER OF ╞┴╘S
  357.     ╞╠        23          2        3     ╞┴╘ SIZE IN SECTORS
  358.     ─┼        17        112      112     ╬UMBER OF ROOT DIRECTORY ENTRIES
  359.     ╘╙       19,20      720     1440     ╘OTAL ╬UMBER OF SECTORS
  360.     ╬╙        24          9        9     ╬UMBER OF SECTORS PER TRACK
  361.     ╬╚        26          2        2     ╬UMBER OF SIDES
  362.  
  363. ╘HE 1571 AND 1581 COLUMNS GIVE THE TYPICAL VALUES OF THESE PARAMETERS FOR
  364. 5.25" AND 3.5" DISKS.  ╘HE ╧╞╞╙┼╘ IS THE ADDRESS OF THE PARAMETER WITHIN THE
  365. BOOT SECTOR.  ╘HE TOTAL NUMBER OF SECTORS IS GIVEN IN LOW-BYTE, HIGH-BYTE
  366. ORDER (SINCE THE 80X86 FAMILY IS LITTLE-ENDIAN LIKE THE 6502 FAMILY).  ╞ROM
  367. THE ABOVE PARAMETERS, WE CAN DERIVE THE FOLLOWING IMPORTANT PARAMETERS:
  368.  
  369.    ┴┬┬╥     ╞╧╥═╒╠┴       1571     1581     ─┼╙├╥╔╨╘╔╧╬
  370.    ----      -------      ----     ----     -----------
  371.     ╞1      ╬┬+╬╞*╞╠         5        7     ╞IRST ROOT DIRECTORY SECTOR
  372.     ╞╙     ╬┬+╬╞*╞╠+─┼      12       14     ╞IRST FILE DATA SECTOR NUMBER
  373.     ╬├     (╘╙-╞╙)/├╙      354      713     ╘OTAL NUMBER OF FILE CLUSTERS
  374.  
  375. ╠╥╥ IMPOSES A NUMBER OF LIMITS ON THESE PARAMETERS AND WILL ERROR-OUT IF YOU
  376. TRY TO USE A DISK THAT IS OUTSIDE OF ╠╥╥'S LIMITS.
  377.  
  378. 3.2. ├╚┼╫╔╬╟ ╘╚┼ ╞┴╘
  379.  
  380. ═╙-─╧╙ DISKS USE A DATA STRUCTURE CALLED A ╞ILE ┴LLOCATION ╘ABLE (╞┴╘) TO
  381. RECORD WHICH CLUSTERS BELONG TO WHICH FILE IN WHAT ORDER AND WHICH BLOCKS ARE
  382. FREE.  ┴ CLUSTER IS A SET OF CONTIGUOUS SECTORS WHICH ARE ALLOCATED TO FILES
  383. AS A GROUP.  ╠╥╥ HANDLES CLUSTER SIZES OF 1 AND 2 SECTORS, GIVING A LOGICAL
  384. FILE BLOCK SIZE OF 512 OR 1024 BYTES.  ╘YPICALLY, A CLUSTER SIZE OF 2 SECTORS
  385. IS USED.
  386.  
  387. ╘HE ╞┴╘ IS AN ARRAY OF 12-BIT NUMBERS, WITH AN ENTRY CORRESPONDING TO EACH
  388. CLUSTER THAT CAN BE ALLOCATED TO FILES.  ╞┴╘ ENTRIES 0 AND 1 ARE RESERVED.  ╔F
  389. A ╞┴╘ ENTRY CONTAINS A VALUE OF $000, THEN THE CORRESPONDING CLUSTER IS FREE
  390. AND CAN BE ALLOCATED TO A FILE; OTHERWISE, THE CLUSTER IS ALLOCATED AND THE
  391. ╞┴╘ ENTRY CONTAINS THE NUMBER OF THE ╬┼╪╘ ╞┴╘ ENTRY THAT BELONGS TO THE FILE.
  392. ╘HUS, ═╙-─╧╙ FILES ARE STORED IN A SINGLY-LINKED LIST OF CLUSTERS LIKE
  393. ├OMMODORE-─╧╙ FILES ARE, EXCEPT THAT THE LINKS ARE NOT IN THE DATA SECTORS BUT
  394. RATHER ARE IN THE ╞┴╘.  ╘HE POINTER TO THE FIRST ╞┴╘ ENTRY FOR A FILE IS GIVEN
  395. IN THE FILE'S DIRECTORY ENTRY.
  396.  
  397. ┴ SPECIAL ╬╒╠╠/╬╔╠ POINTER VALUE OF $╞╞╞ IS USED TO INDICATE THE END OF THE
  398. CHAIN OF CLUSTERS ALLOCATED TO A FILE.  ╘HIS VALUE IS STORED IN THE ╞┴╘ ENTRY
  399. OF THE LAST CLUSTER ALLOCATED TO A FILE (OF COURSE).  ├ONSIDER THE FOLLOWING
  400. EXAMPLE ╞┴╘:
  401.  
  402.    ┼╬╘╥┘       ╓┴╠╒┼
  403.    -----       -----
  404.     $000        $╞╞╞
  405.     $001        $╞╞╞
  406.     $002   ⁿ----$003 <------─IRECTORY ┼NTRY
  407.     $003   +--> $005----+
  408.     $004        $000    ⁿ
  409.     $005        $╞╞╞ <--+
  410.  
  411. ┼NTRIES 0 AND 1 ARE INSIGNIFICANT SINCE THEY ARE RESERVED.  ╙AY THAT A FILE
  412. STARTS AT ╞┴╘ ENTRY #2.  ╘HEN, IT CONSISTS OF THE FOLLOWING CHAIN OF CLUSTERS:
  413. 2, 3, AND 5.  ├LUSTER #4 IS FREE.  ├LUSTERS CAN BE ALLOCATED TO A FILE IN
  414. RANDOM ORDER, BUT IF THEY ARE ALLOCATED CONTIGUOUSLY IN FORWARD ORDER, THEN
  415. THE FILE WILL BE ABLE TO BE READ FASTER.  ╘HE ╞┴╘ IS SUCH AN IMPORTANT DATA
  416. STRUCTURE THAT TYPICALLY TWO COPIES ARE KEPT ON THE DISK INCASE ONE OF THEM
  417. SHOULD BECOME CORRUPTED.
  418.  
  419. ╘HE ═╙-─╧╙ DESIGNERS WERE A LITTLE SNEAKY IN STORING THE 12-BIT ╞┴╘ ENTRIES -
  420. THEY USED ONLY 12 REAL BITS PER ENTRY.  ╔E., THEY STORE TWO ╞┴╘ ENTRIES IN
  421. THREE BYTES, WHERE THE TWO ENTRIES SHARE THE TWO NYBBLES OF THE MIDDLE BYTE.
  422. ╘HE FOLLOWING DIAGRAM SHOWS HOW THE NYBBLES 1 (HIGH), 2 (MID), AND 3 (LOW) ARE
  423. STORED INTO ╞┴╘ ENTRIES ┴ AND ┬:
  424.  
  425.      ┬┘╘┼:       0            1            2
  426.              +---+---+    +---+---+    +---+---+
  427.     ┼╬╘╥┘:   ⁿ ┴ ⁿ ┴ ⁿ    ⁿ ┬ ⁿ ┴ ⁿ    ⁿ ┬ ⁿ ┬ ⁿ
  428.    ╬┘┬┬╠┼:   ⁿ 2 ⁿ 3 ⁿ    ⁿ 3 ⁿ 1 ⁿ    ⁿ 1 ⁿ 2 ⁿ
  429.              +---+---+    +---+---+    +---+---+
  430.  
  431. ┴NYWAY, LET'S JUST SAY IT'S A BIT TRICKY TO EXTRACT THE 12-BIT VALUES FROM
  432. THIS COMPRESSED DATA STRUCTURE.  ╧N TOP OF THAT, ╔ DON'T THINK THERE IS ANY
  433. SAVING IN DISK SPACE RESULTING FROM COMPRESSING THIS STRUCTURE; THEY MIGHT AS
  434. WELL HAVE JUST USED A 16-BIT ╞┴╘ (LIKE THEY DO NOWADAYS ON LARGER DISKS).
  435.  
  436. 3.3. ╘╚┼ ╥╧╧╘ ─╔╥┼├╘╧╥┘
  437.  
  438. ╘HE ROOT DIRECTORY HAS A FIXED SIZE, ALTHOUGH ╔ DON'T THINK THAT
  439. SUBDIRECTORIES DO.  ╠╥╥ CANNOT ACCESS SUBDIRECTORIES.  ┼ACH 512-BYTE SECTOR OF
  440. THE ROOT DIRECTORY CONTAINS SIXTEEN 32-BYTE DIRECTORY ENTRIES.  ╧NE DIRECTORY
  441. ENTRY IS REQUIRED FOR EACH FILE STORED ON THE DISK.  ┴ DIRECTORY ENTRY HAS THE
  442. FOLLOWING STRUCTURE:
  443.  
  444.    ╧╞╞╙┼╘     ╠┼╬     ─┼╙├╥╔╨╘╔╧╬
  445.    ------     ---     -----------
  446.      0..7       8     ╞ILENAME
  447.     8..10       3     ┼XTENSION
  448.        11       1     <UNUSED?>
  449.        12       1     ┴TTRIBUTES: $10=─IRECTORY, $08=╓OLUME╔D
  450.    13..21       9     <UNUSED>
  451.    22..25       4     ─ATE
  452.    26..27       2     ╙TARTING ╞┴╘ ENTRY NUMBER
  453.    28..31       4     ╞ILE LENGTH IN BYTES
  454.  
  455. ╘HE FILENAME AND EXTENSION ARE STORED WITH TRAILING PADDING SPACES.  ╔F A
  456. DIRECTORY ENTRY IS UNUSED OR DELETED, THEN THE FIRST CHARACTER OF THE FILENAME
  457. IS EITHER A $00 OR A $┼5 (229).  ╘HIS IS WHY YOU HAVE TO PROVIDE THE FIRST
  458. CHARACTER OF A FILENAME IF YOU ARE UNDELETING A FILE ON AN ═╙-─╧╙ MACHINE.
  459. ╬OTE THAT THERE IS ENOUGH UNUSED SPACE THAT ═ICROSOFT OR ╔┬═ COULD HAVE
  460. DITCHED THE ANNOYING 8+3 CHARACTER FILENAME FORMAT.
  461.  
  462. ╘HE ATTRIBUTES BITS TELL WHETHER THE DIRECTORY ENTRY IS FOR A REGULAR FILE, A
  463. SUBDIRECTORY, A DISK VOLUME NAME (IN WHICH CASE THERE IS NO FILE DATA), AND A
  464. COUPLE OF OTHER THINGS ╔ CAN'T REMEMBER.  ╔'M NOT SURE ABOUT THE EXACT
  465. POSITION OR FORMAT OF THE DATE, BUT ╠╥╥ DOESN'T USE IT ANYWAY.  ╘HE STARTING
  466. ╞┴╘ ENTRY NUMBER AND THE FILE LENGTH ARE STORED IN LOWER-BYTE-FIRST ORDER.
  467.  
  468. 3.4. ╘╚┼ ╞╔╠┼ ─┴╘┴ ╙╨┴├┼
  469.  
  470. ╘HE RAMAINDER OF THE DISK SPACE IS USED FOR STORING FILE DATA IN CLUSTERS OF 1
  471. OR 2 SECTORS EACH.  ╟IVEN A CLUSTER NUMBER (WHICH IS ALSO THE ╞┴╘ ENTRY
  472. NUMBER), THE FOLLOWING FORMULA IS USED TO CALCULATE THE STARTING LOGICAL
  473. SECTOR NUMBER OF THE CLUSTER:
  474.  
  475. (├LUSTER╬UMBER - 2) * ├LUSTER╙IZE╔N┬LOCKS + ╞IRST╞ILE─ATA╠OGICAL╙ECTOR╬UMBER
  476.  
  477. WHERE "╞IRST╞ILE─ATA╠OGICAL╙ECTOR╬UMBER" IS THE "╞╙" PARAMETER DERIVED
  478. EARLIER.  ╘HE FOLLOWING CONSECUTIVE LOGICAL SECTOR NUMBERS UP TO THE NUMBER OF
  479. SECTORS PER CLUSTER FORM THE REST OF THE CLUSTER.  ╬OTE THAT A SINGLE CLUSTER
  480. CAN SPAN SECTORS FROM ONE SIDE OF THE DISK TO ANOTHER OR FROM ONE TRACK TO
  481. ANOTHER.  ╫E PERFORM THE "(├LUSTER╬UMBER - 2)" PORTION OF THE CALCULATION
  482. SINCE THE FIRST TWO ╞┴╘ ENTRIES ARE RESERVED.
  483.  
  484. ╙INCE THE ╥EAD BURST COMMAND OF THE 1571/81 WANTS THE SIDE, TRACK, AND SECTOR
  485. NUMBER OF A SECTOR RATHER THAN ITS LOGICAL NUMBER, WE ALSO NEED FORMULAE FOR
  486. THESE CONVERSIONS:
  487.  
  488.    ╘RACK  = ╠OGICAL╙ECTOR╬UMBER / 18
  489.    ╙ECTOR = ╠OGICAL╙ECTOR╬UMBER % 9 + 1
  490.    ╙IDE   = (╠OGICAL╙ECTOR╬UMBER / 9) % 2
  491.  
  492. ╘HESE FORMULAE ARE MORE PROBLEMATIC THAN THE PREVIOUS ONE SINCE THEY REQUIRE
  493. DIVISION BY 9 AND 18.  ╠╥╥ USES THE METHOD OF REPEATED SUBTRACTION TO PERFROM
  494. THE NECESSARY DIVISION (ONLY ONE DIVISION IS NECESSARY).  ╘HE ABOVE FORMULAE
  495. IMPLY THAT SEQUENTIAL LOGICAL SECTORS ARE STORED ON THE TOP OF THE DISK
  496. FIRST AND THEN THE BOTTOM OF THE DISK OF THE SAME TRACK, AND THEN ON THE TOP
  497. OF THE NEXT TRACK, ETC.  ╘HIS IS A GOOD SECTOR NUMBERING SCHEME (UNLIKE THE
  498. ├┬═-─╧╙ SCHEME FOR 1571 SECTORS) SINCE IT IS FASTER TO SWITCH SIDES OF THE
  499. DISK THAN IT IS TO SWITCH TRACKS, SO YOU CAN READ THE DISK FASTER.
  500.  
  501. ╧H YEAH, THE WAY THAT YOU KNOW HOW MANY FILE DATA BYTES ARE IN THE LAST
  502. CLUSTER OF A FILE CHAIN (THE CLUSTER WITH THE ╬╒╠╠ ╞┴╘ ENTRY) IS TO TAKE THE
  503. FILE LENGTH FROM THE DIRECTORY ENTRY AND "MOD" (THE ├ LANGUAGE % OPERATOR) IT
  504. WITH THE CLUSTER SIZE.  ╧NE SPECIAL CASE IS IF THIS CALCULATION RESULTS IN A
  505. ZERO, THEN THE LAST CLUSTER IS COMPLETELY FULL (RATHER THAN COMPLETELY EMPTY
  506. AS THE CALCULATION WOULD SUGGEST).  ╘HIS CALCULATION IS EASILY DONE IN
  507. MACHINE LANGUAGE WITH AN ┴╬─ OPERATION SINCE THE CLUSTER SIZE IS ALWAYS A
  508. POWER OF TWO.
  509.  
  510. 4. ╞╔╠┼ ├╧╨┘╔╬╟ ╨┴├╦┴╟┼
  511.  
  512. ╘HIS SECTION DISCUSSES THE INTERFACE TO AND IMPLEMENTATION OF THE ═╙-─╧╙ FILE
  513. COPYING PACKAGE.  ╔T IS WRITTEN IN ASSEMBLY LANGUAGE AND IS LOADED INTO MEMORY
  514. AT ADDRESS $8000 ON BANK 0 AND REQUIRES ABOUT 13╦ OF MEMORY.  ╘HE PACKAGE IS
  515. LOADED AT THIS HIGH ADDRESS TO BE OUT OF THE WAY OF THE MAIN ┬┴╙╔├ PROGRAM,
  516. EVEN IF ╥┴═─╧╙ IS INSTALLED.
  517.  
  518. 4.1. ╔╬╘┼╥╞┴├┼
  519.  
  520. ╘HE SUBROUTINE CALL AND PARAMETER PASSING INTERFACE TO THE FILE COPYING
  521. PACKAGE IS SUMMARIZED AS FOLLOWS:
  522.  
  523.    ┴──╥┼╙╙     ─┼╙├╥╔╨╘╔╧╬
  524.    -------     -----------
  525.    ╨╦          ╔NIT╨ACKAGE SUBROUTINE
  526.    ╨╦+3        ╠OAD─IRECTORY SUBROUTINE
  527.    ╨╦+6        ├OPY╞ILE SUBROUTINE
  528.    ╨╦+9        TWO-BYTE PACKAGE IDENTIFICATION NUMBER
  529.    ╨╦+15       ERRNO : ERROR CODE RETURNED
  530.    ╨╦+16       ═╙-─╧╙ DEVICE NUMBER (8 TO 30)
  531.    ╨╦+17       ═╙-─╧╙ DEVICE TYPE ($00=1571, $╞╞=1581)
  532.    ╨╦+18       TWO-BYTE STARTING CLUSTER NUMBER FOR FILE COPYING
  533.    ╨╦+20       LOW AND MID BYTES OF FILE LENGTH FOR COPYING
  534.  
  535. WHERE "╨╦" IS THE LOAD ADDRESS OF THE PACKAGE.  ┴DDITIONAL SUBROUTINE
  536. PARAMETERS ARE PASSED IN THE PROCESSOR REGISTERS.
  537.  
  538. ╘HE "╔NIT╨ACKAGE" SUBROUTINE SHOULD BE CALLED WHEN THE PACKAGE IS FIRST
  539. INSTALLED, WHENEVER THE ═╙-─╧╙ DEVICE NUMBER IS CHANGED, AND WHENEVER A NEW
  540. DISK IS MOUNTED TO INVALIDATE THE INTERNAL TRACK CACHE.  ╔T REQUIRES NO
  541. PARAMETERS.
  542.  
  543. ╘HE "╠OAD─IRECTORY" SUBROUTINE WILL LOAD THE DIRECTORY, ╞┴╘, AND THE ┬OOT
  544. ╙ECTOR PARAMETERS INTO THE INTERNAL MEMORY OF THE PACKAGE FROM THE CURRENT
  545. ═╙-─╧╙ DEVICE NUMBER.  ╬O (OTHER) INPUT PARAMETERS ARE NEEDED AND THE
  546. SUBROUTINE RETURNS A POINTER TO THE DIRECTORY SPACE IN THE .┴┘ REGISTERS AND
  547. THE NUMBER OF DIRECTORY ENTRIES IN THE .╪ REGISTER.  ╔F AN ERROR OCCURS, THEN
  548. THE SUBROUTINE RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IS AVAILABLE
  549. IN THE "ERRNO" INTERFACE VARIABLE.  ╘HE DIRECTORY ENTRY DATA IS IN THE
  550. DIRECTORY SPACE AS IT WAS READ IN RAW FROM THE DIRECTORY SECTORS ON THE ═╙-─╧╙
  551. DISK.
  552.  
  553. ╘HE "├OPY╞ILE" SUBROUTINE WILL COPY A SINGLE FILE FROM THE ═╙-─╧╙ DISK TO A
  554. SPECIFIED ├┬═-╦ERNAL LOGICAL FILE NUMBER (THE ├┬═ FILE MUST ALREADY BE
  555. OPENED).  ╔F THE ├┬═ LOGICAL FILE NUMBER IS ZERO, THEN THE FILE DATA IS SIMPLY
  556. DISCARDED AFTER IT IS READ FROM THE ═╙-─╧╙ FILE.  ╘HE STARTING CLUSTER NUMBER
  557. OF THE FILE TO COPY AND THE LOW AND MID BYTES OF THE FILE LENGTH ARE PASSED IN
  558. THE ╨╦+18 AND ╨╦+20 INTERFACE WORDS.  ╘HE TRANSLATION MODE TO USE IS PASSED IN
  559. THE .┴ REGISTER ($00=BINARY, $╞╞=ASCII) AND THE ├┬═ LOGICAL FILE NUMBER TO
  560. OUTPUT TO IS PASSED IN THE .╪ REGISTER.  ╔F AN ERROR OCCURS, THE ROUTINE
  561. RETURNS WITH THE ├ARRY FLAG SET AND THE ERROR CODE IN THE "ERRNO" INTERFACE
  562. VARIABLE.  ╘HERE ARE NO OTHER OUTPUT PARAMETERS.
  563.  
  564. ╬OTE THAT SINCE THE STARTING CLUSTER NUMBER AND LOW-FILE LENGTH OF THE FILE TO
  565. BE COPIED ARE REQUIRED RATHER THAN THE FILENAME, IT IS THE RESPONSIBILITY OF
  566. THE FRONT-END APPLICATION PROGRAM TO DIG THROUGH THE RAW DIRECTORY SECTOR DATA
  567. TO GET THIS INFORMATION.  ╘HE APPLICATION MUST ALSO OPEN THE ├OMMODORE-─╧╙
  568. FILE OF WHATEVER FILETYPE ON WHATEVER DEVICE IS REQUIRED; THE PACKAGE DOES NOT
  569. NEED TO KNOW THE ├OMMODORE-─╧╙ DEVICE NUMBER.
  570.  
  571. ╘HE ═╙-─╧╙ DEVICE NUMBER AND DEVICE TYPE INTERFACE VARIABLES ALLOW YOU TO SET
  572. THE ═╙-─╧╙ DRIVE AND THE PACKAGE IDENTIFICATION NUMBER ALLOWS THE APPLICATION
  573. PROGRAM TO CHECK IF THE PACKAGE IS ALREADY LOADED INTO MEMORY SO THAT IT ONLY
  574. HAS TO LOAD THE PACKAGE THE FIRST TIME THE APPLICATION IS RUN AND NOT ON
  575. RE-RUNS.  ╘HE IDENTIFICATION SEQUENCE IS A VALUE OF $├┬ FOLLOWED BY A VALUE
  576. OF 131.
  577.  
  578. 4.2. ╔═╨╠┼═┼╬╘┴╘╔╧╬
  579.  
  580. ╘HIS SECTION PRESENTS THE CODE THAT IMPLEMENTS THE ═╙-─╧╙ FILE READING
  581. PACKAGE.  ╔T IS HERE IN A SPECIAL FORM; EACH CODE LINE IS PRECEDED BY A FEW
  582. SPECIAL CHARACTERS AND THE LINE NUMBER.  ╘HE SPECIAL CHARACTERS ARE THERE TO
  583. ALLOW YOU TO EASILY EXTRACT THE ASSEMBLER CODE FROM THE REST OF THIS MAGAZINE
  584. (AND ALL OF MY UGLY COMMENTS).  ╧N A ╒NIX SYSTEM, ALL YOU HAVE TO DO IS
  585. EXECUTE THE FOLLOWING COMMAND LINE (SUBSTITUTE FILENAMES AS APPROPRIATE):
  586.  
  587. GREP '^\.%...\!' ╚ACK4 ⁿ SED 'S/^.%...\!..//' ⁿ SED 'S/.%...\!//' >LRR.S
  588.  
  589. ┘OU'LL NOTICE THAT THE INITIAL COMMENT LINES HERE WERE AN AFTERTHOUGHT.
  590.  
  591. .%000!  ;╠ITTLE ╥ED ╥EADER ═╙-─╧╙ FILE COPIER PROGRAM
  592. .%000!  ;WRITTEN 92/10/03 BY ├RAIG ┬RUCE FOR ├= ╚ACKING ╬ET ═AGAZINE
  593. .%000!
  594.  
  595. ╘HE CODE IS WRITTEN FOR THE ┬UDDY ASSEMBLER AND HERE ARE A COUPLE SETUP
  596. DIRECTIVES.  ╬OTE THAT MY COMMENTS COME BEFORE THE SECTION OF CODE.
  597.  
  598. .%001!  .ORG $8000
  599. .%002!  .OBJ "@:LRR.BIN"
  600. .%003!
  601. .%004!  ;====JUMP TABLE AND PARAMETERS INTERFACE ====
  602. .%005!
  603. .%006!  JMP INIT╨ACKAGE
  604. .%007!  JMP LOAD─IRECTORY
  605. .%008!  JMP COPY╞ILE
  606. .%009!
  607. .%010!  .BYTE $CB,131   ;IDENTIFICATION
  608. .%011!  .BYTE 0,0,0,0
  609. .%012!
  610.  
  611. ╘HESE VARIABLES ARE INCLUDED IN THE PACKAGE PROGRAM SPACE TO MINIMIZE UNWANTED
  612. INTERACTION WITH OTHER PROGRAMS LOADED AT THE SAME TIME, SUCH AS THE ╥┴═─╧╙
  613. DEVICE DRIVER.
  614.  
  615. .%013!  ERRNO           .BUF 1    ;(LOCATION PK+15)
  616. .%014!  SOURCE─EVICE    .BUF 1
  617. .%015!  SOURCE╘YPE      .BUF 1    ;$00=1571, $FF=1581
  618. .%016!  START├LUSTER    .BUF 2
  619. .%017!  LEN═╠           .BUF 2    ;LENGTH MEDIUM AND LOW BYTES
  620. .%018!
  621. .%019!  ;====GLOBAL DECLARAIONS====
  622. .%020!
  623. .%021!  KERNEL╠ISTEN = $FFB1
  624. .%022!  KERNEL╙ECOND = $FF93
  625. .%023!  KERNEL╒NLSN  = $FFAE
  626. .%024!  KERNEL┴CPTR  = $FFA2
  627. .%025!  KERNEL├IOUT  = $FFA8
  628. .%026!  KERNEL╙PINP  = $FF47
  629. .%027!  KERNEL├HKOUT = $FFC9
  630. .%028!  KERNEL├LRCHN = $FFCC
  631. .%029!  KERNEL├HROUT = $FFD2
  632. .%030!
  633. .%031!  ST = $D0
  634. .%032!  CIA├LOCK = $DD00
  635. .%033!  CIA╞LAGS = $DC0D
  636. .%034!  CIA─ATA  = $DC0C
  637. .%035!
  638.  
  639. ╘HESE ARE THE PARAMETERS AND DERIVED PARAMETERS FROM THE BOOT SECTOR.  ╘HEY
  640. ARE KEPT IN THE PROGRAM SPACE TO AVOID INTERACTIONS.
  641.  
  642. .%036!  CLUSTER┬LOCK├OUNT .BUF 1        ;1 OR 2
  643. .%037!  FAT┬LOCKS         .BUF 1        ;UP TO 3
  644. .%038!  ROOT─IR┬LOCKS     .BUF 1        ;UP TO 8
  645. .%039!  ROOT─IR┼NTRIES    .BUF 1        ;UP TO 128
  646. .%040!  TOTAL╙ECTORS      .BUF 2        ;UP TO 1440
  647. .%041!  FIRST╞ILE┬LOCK    .BUF 1
  648. .%042!  FIRST╥OOT─IR┬LOCK .BUF 1
  649. .%043!  FILE├LUSTER├OUNT  .BUF 2
  650. .%044!
  651.  
  652. ╘HE CYLINDER (TRACK) AND SIDE THAT IS CURRENTLY STORED IN THE TRACH CACHE.
  653.  
  654. .%045!  BUF├YLINDER     .BUF 1
  655. .%046!  BUF╙IDE         .BUF 1
  656. .%047!  FORMAT╨ARMS     .BUF 6
  657. .%048!
  658.  
  659. ╘HIS PACKAGE IS SPLIT INTO A NUMBER OF LEVELS.  ╘HIS LEVEL INTERFACES WITH THE
  660. ╦ERNAL SERIAL BUS ROUTINES AND THE BURST COMMAND PROTOCOL OF THE DISK DRIVES.
  661.  
  662. .%049!  ;====HARDWARE LEVEL====
  663. .%050!
  664.  
  665. ├ONNECT TO THE ═╙-─╧╙ DEVICE AND SEND THE "╒0" BURST COMMAND PREFIX AND THE
  666. BURST COMMAND BYTE.
  667.  
  668. .%051!  SEND╒0 = *  ;( .┴=BURST├OMMAND├ODE ) : .├╙=ERR
  669. .%052!     PHA
  670. .%053!     LDA #0
  671. .%054!     STA ST
  672. .%055!     LDA SOURCE─EVICE
  673. .%056!     JSR KERNEL╠ISTEN
  674. .%057!     LDA #$6F
  675. .%058!     JSR KERNEL╙ECOND
  676. .%059!     LDA #"U"
  677. .%060!     JSR KERNEL├IOUT
  678. .%061!     BIT ST
  679. .%062!     BMI SEND╒0┼RROR
  680. .%063!     LDA #"0"
  681. .%064!     JSR KERNEL├IOUT
  682. .%065!     PLA
  683. .%066!     JSR KERNEL├IOUT
  684. .%067!     BIT ST
  685. .%068!     BMI SEND╒0┼RROR
  686. .%069!     CLC
  687. .%070!     RTS
  688. .%071!
  689. .%072!     SEND╒0┼RROR = *
  690. .%073!     LDA #5
  691. .%074!     STA ERRNO
  692. .%075!     SEC
  693. .%076!     RTS
  694. .%077!
  695.  
  696. ╘OGGLE THE "─ATA ┴CCEPTED / ╥EADY ╞OR ═ORE" CLOCK SIGNAL FOR THE BURST
  697. TRANSFER PROTOCOL.
  698.  
  699. .%078!  TOGGLE├LOCK = *
  700. .%079!     LDA CIA├LOCK
  701. .%080!     EOR #$10
  702. .%081!     STA CIA├LOCK
  703. .%082!     RTS
  704. .%083!
  705.  
  706. ╫AIT FOR A BURST BYTE TO ARRIVE IN THE SERIAL DATA REGISTER OF ├╔┴#1 FROM THE
  707. FAST SERIAL BUS.
  708.  
  709. .%084!  SERIAL╫AIT = *
  710. .%085!     LDA #$08
  711. .%086!  -  BIT CIA╞LAGS
  712. .%087!     BEQ -
  713. .%088!     RTS
  714. .%089!
  715.  
  716. ╫AIT FOR AND GET A BURST BYTE FROM THE FAST SERIAL BUS, AND SEND THE "─ATA
  717. ┴CCEPTED" SIGNAL.
  718.  
  719. .%090!  GET┬URST┬YTE = *
  720. .%091!     JSR SERIAL╫AIT
  721. .%092!     LDX CIA─ATA
  722. .%093!     JSR TOGGLE├LOCK
  723. .%094!     TXA
  724. .%095!     RTS
  725. .%096!
  726.  
  727. ╙END THE BURST COMMANDS TO "LOG IN" THE ═╙-─╧╙ DISK AND SET THE ╥EAD SECTOR
  728. INTERLEAVE FACTOR.
  729.  
  730. .%097!  MOUNT─ISK = *  ;() : .├╙=ERR
  731. .%098!     LDA #%00011010
  732. .%099!     JSR SEND╒0
  733. .%100!     BCC +
  734. .%101!     RTS
  735. .%102!  +  JSR KERNEL╒NLSN
  736. .%103!     BIT ST
  737. .%104!     BMI SEND╒0┼RROR
  738. .%105!     CLC
  739. .%106!     JSR KERNEL╙PINP
  740. .%107!     BIT CIA╞LAGS
  741. .%108!     JSR TOGGLE├LOCK
  742. .%109!     JSR GET┬URST┬YTE
  743. .%110!     STA ERRNO
  744. .%111!     AND #$0F
  745. .%112!     CMP #2
  746. .%113!     BCS MOUNT┼XIT
  747.  
  748. ╟RAB THE THROW-AWAY PARAMETERS FROM THE MOUNT OPERATION.
  749.  
  750. .%114!     LDY #0
  751. .%115!  -  JSR GET┬URST┬YTE
  752. .%116!     STA FORMAT╨ARMS,Y
  753. .%117!     INY
  754. .%118!     CPY #6
  755. .%119!     BCC -
  756. .%120!     CLC
  757.  
  758. ╙ET THE SECTOR INTERLEAVE TO 1 FOR A 1581 OR 4 FOR A 1571.
  759.  
  760. .%121!     ;** SET INTERLEAVE
  761. .%122!     LDA #%00001000
  762. .%123!     JSR SEND╒0
  763. .%124!     BCC +
  764. -- 
  765.  
  766. - ├RAIG ╘AYLOR   ⁿⁿ ╙TANDARD ─ISCLAIMER ┴PPLIES (OF COURSE!)
  767. DUCK@PEMBVAX1.PEMBROKE.EDU (╨EMBROKE ╙TATE ╒NIVERSITY)
  768.  
  769. ╧REGON, N.:
  770.         ┼IGHTY BILLION GALLONS OF WATER WITH NO PLACE TO GO ON ╙ATURDAY
  771.         NIGHT.
  772. ┼ND OF ╞ILE, ╨RESS ╥┼╘╒╥╬ TO QUIT
  773. ┴RTICLE #10125 (10178 IS LAST):
  774. ╞ROM: DUCK@PEMBVAX1.PEMBROKE.EDU
  775. ╬EWSGROUPS: COMP.SYS.CBM
  776. ╙UBJECT: ├OMMODORE ╚ACKING ╔SSUE #4 5/5
  777. ─ATE: ═ON ╧CT  5 10:03:18 1992
  778.  
  779. .%708!  CLUSTER┬UF = TRACKBUF+4608
  780. .%709!  FATBUF     = CLUSTER┬UF+1024
  781. .%710!  DIRBUF     = FATBUF+1536
  782. .%711!  END        = DIRBUF+4096
  783.  
  784. 5. ╒╙┼╥-╔╬╘┼╥╞┴├┼ ╨╥╧╟╥┴═
  785.  
  786. ╘HIS SECTION PRESENTS THE LISTING OF THE USER-INTERFACE ┬┴╙╔├ PROGRAM.  ┘OU
  787. SHOULD BE AWARE THAT YOU CAN EASILY CHANGE SOME OF THE DEFAULTS TO YOUR OWN
  788. PREFERENCES IF YOU WISH.  ╘HIS PROGRAM IS NOT LISTED IN THE ".%NNN!" FORMAT
  789. THAT THE ASSEMBLER LISTING IS SINCE YOU CAN RECOVER THIS LISTING FROM THE
  790. UUENCODED BINARY PROGRAM FILE.  ╘HIS PROGRAM SHOULD BE A LITTLE EASIER TO
  791. FOLLOW THAN THE ASSEMBLER LISTING SINCE ┬┴╙╔├ IS A SELF-COMMENTING LANGUAGE. :-) 
  792.  
  793. 10 REM LITTLE RED READER, BY CRAIG BRUCE, 30-SEP-92, FOR C= HACKING NETMAG
  794. 11 :
  795.  
  796. ╘HESE LINES SET UP THE DEFAULT ├┬═-─╧╙ AND ═╙-─╧╙ DEVICE NUMBERS, TAKING CARE
  797. TO DISALLOW THEM TO BE THE SAME DEVICE.  ┘OU CAN CHANGE THIS TO YOUR OWN DRIVE
  798. CONFIGURATION.
  799.  
  800. 20 CD=PEEK(186)  : REM ** DEFAULT CBM-DOS DRIVE **
  801. 25 DV=9:DT=0  :  REM ** MS-DOS DRIVE, TYPE (0=1571,255=1581)
  802. 26 IF DV=CD THEN DV=8:DT=0 : REM ** ALTERNATE MS-DOS DRIVE
  803. 27 :
  804. 30 PRINT CHR$(147);"INITIALIZING..." : PRINT
  805. 40 BANK0 : PK=DEC("8000")
  806.  
  807.  
  808. 50 IF PEEK(PK+9)=DEC("CB") AND PEEK(PK+10)=131 THEN 60
  809. 55 PRINT"LOADING MACHINE LANGUAGE ROUTINES..." : BLOAD"LRR.BIN",U(CD)
  810. 60 POKE PK+16,DV : POKE PK+17,DT : SYS PK
  811.  
  812. ╔ "DIM" THE FOLLOWING VARIABLES BEFORE THE ARRAYS TO AVOID THE OVERHEAD OF
  813. PUSHING THE ARRAYS AROUND WHEN CREATING NEW SCALAR VARIABLES.
  814.  
  815. 70 DIM T,R,B,I,A$,C,DT$,FL$,IL$,X,X$
  816. 80 DIM DI$(128),CL(128),SZ(128)
  817. 90 IF DT=255 THEN DT$="1581" :ELSE DT$="1571"
  818. 100 FL$=CHR$(19)+CHR$(17)+CHR$(17)+CHR$(17)+CHR$(17)
  819. 110 IL$=FL$:FORI=1TO19:IL$=IL$+CHR$(17):NEXT
  820. 120 GOTO 500
  821. 130 :
  822. 131 REM ** LOAD MS-DOS DIRECTORY **
  823. 140 PRINT"LOADING DIRECTORY..." : PRINT
  824. 150 SYS PK : SYS PK+3
  825. 160 DL=0
  826.  
  827. ╘HE "RREG" INSTRUCTION RETURNS THE RETURN VALUES OF THE .┴, .╪, .┘, AND .╙
  828. REGISTERS FROM THE LAST "SYS" CALL.  ╔ CHECK THE 1-BIT OF THE .╙ REGISTER
  829. (THE ├ARRY FLAG) FOR ERROR RETURNS.
  830.  
  831. 170 RREG BL,DC,BH,S : E=PEEK(PK+15)
  832. 180 IF (S AND 1) THEN GOSUB 380 : RETURN
  833. 190 PRINT"SCANNING DIRECTORY..." : PRINT
  834. 200 DB=BL+256*BH
  835. 210 IF DC=0 THEN 360
  836. 220 FOR DP=DB TO DB+32*(DC-1) STEP 32
  837. 230 IF PEEK(DP)=0 OR PEEK(DP)=229 THEN 350
  838. 240 IF PEEK(DP+12) AND 24 THEN 350
  839. 250 DL=DL+1
  840.  
  841. ╘HIS NEXT LINE IS WHERE ╔ SET THE DEFAULT SELECTION STATUS, TRANSLATION TYPE,
  842. AND ├┬═ FILE TYPE FOR THE ═╙-─╧╙ FILES.  ┘OU CAN CHANGE THESE DEFAULTS SIMPLY
  843. BY OVERTYPING THE STRING IN   (  ⁿ  ⁿⁿⁿ  ⁿⁿⁿ  ) THE "╓" LOCATIONS.
  844.                                  ╓  ╓╓╓  ╓╓╓
  845. 260 D$=RIGHT$(" "+STR$(DL),3)+"     ASC  SEQ  " : REM ** DEFAULT SEL/TR/FT **
  846. 270 A$="" : FORI=0TO10 : A$=A$+CHR$(PEEK(DP+I)) : NEXT
  847. 280 A$=LEFT$(A$,8)+"  "+RIGHT$(A$,3)
  848. 290 PRINT DL; A$
  849. 300 D$=D$+A$+"  "
  850. 310 CL(DL)=PEEK(DP+26)+256*PEEK(DP+27)
  851. 320 SZ=PEEK(DP+28)+256*PEEK(DP+29)+65536*PEEK(DP+30)
  852. 330 DI$(DL)=D$+RIGHT$("    "+STR$(SZ),6)
  853. 340 SZ(DL)=SZ
  854. 350 NEXT DP
  855. 360 RETURN
  856. 370 :
  857. 371 REM ** REPORT MS-DOS DISK ERROR **
  858. 380 PRINT CHR$(18);"MS-DOS DISK ERROR #";MID$(STR$(E),2);
  859. 390 PRINT " ($";MID$(HEX$(E),3);"), PRESS KEY.";CHR$(146)
  860. 400 GETKEY A$ : RETURN
  861. 410 :
  862. 411 REM ** SCREEN HEADING **
  863. 420 PRINTCHR$(147);"MS-DEV=";MID$(STR$(DV),2);"    MS-TYPE=";DT$;
  864. 430 PRINT"    CBM-DEV=";MID$(STR$(CD),2):PRINT
  865. 440 RETURN
  866. 450 :
  867. 451 REM ** SCREEN FOOTING **
  868. 460 PRINT IL$;"D=DIRECTORY  M=MS-DEV  F=CBM-DEV Q=QUIT"
  869. 470 PRINT"T=TOGGLE-COLUMN, C=COPY-FILES, +/- PAGE";
  870. 480 RETURN
  871. 490 :
  872. 491 REM ** MAIN ROUTINE **
  873. 500 T=1 : C=0
  874. 510 R=0
  875. 520 GOSUB 420
  876. 530 PRINT "NUM  S  TRN  TYP  FILENAME  EXT  LENGTH"
  877. 540 PRINT "---  -  ---  ---  --------  ---  ------"
  878. 550 GOSUB 460
  879. 560 B=T+17 : IF B>DL THEN B=DL
  880. 570 PRINT FL$;: IF T>DL THEN 590
  881. 580 FOR I=T TO B : PRINT DI$(I) : NEXT
  882. 590 IF DL=0 THEN PRINT CHR$(18);"<NO FILES>";CHR$(146)
  883. 600 IF DL=0 THEN 660
  884. 610 PRINT LEFT$(IL$,R+5);CHR$(18);
  885. 620 ON C+1 GOTO 630,640,650
  886. 630 PRINT SPC(4);MID$(DI$(T+R),5,3) : GOTO 660
  887. 640 PRINT SPC(7);MID$(DI$(T+R),8,5) : GOTO 660
  888. 650 PRINT SPC(12);MID$(DI$(T+R),13,5) : GOTO 660
  889. 660 GETKEY A$
  890.  
  891.